package com.wjf.userservice.controller;

import com.wjf.common.entity.Result;
import com.wjf.userservice.entity.User;
import com.wjf.userservice.mapper.UserMapper;
import com.wjf.userservice.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/users")
public class UserController {

    private static final Logger log = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 用户登录
     */
    @PostMapping("/login")
    public Result<?> login(@RequestParam String username, @RequestParam String password) {
        try {
            log.info("收到登录请求 - 用户名: {}", username);
            
            String token = userService.login(username, password);
            if (token == null) {
                return Result.error("用户名或密码错误");
            }
            
            Map<String, String> data = new HashMap<>();
            data.put("token", token);
            return Result.success("登录成功", data);
        } catch (Exception e) {
            log.error("登录失败", e);
            return Result.error("登录失败：" + e.getMessage());
        }
    }

    /**
     * 用户注册
     */
    @PostMapping("/register")
    public Result<?> register(@RequestBody User user) {
        try {
            // 参数校验
            if (!StringUtils.hasText(user.getUsername())) {
                return Result.error("用户名不能为空");
            }
            if (!StringUtils.hasText(user.getPassword())) {
                return Result.error("密码不能为空");
            }
            if (StringUtils.hasText(user.getPhone()) && 
                !user.getPhone().matches("^1[3-9]\\d{9}$")) {
                return Result.error("手机号格式不正确");
            }
            if (StringUtils.hasText(user.getEmail()) && 
                !user.getEmail().matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")) {
                return Result.error("邮箱格式不正确");
            }

            boolean success = userService.register(user);
            if (success) {
                return Result.success("注册成功", null);
            } else {
                return Result.error("用户名已存在");
            }
            
        } catch (Exception e) {
            log.error("注册失败", e);
            return Result.error("注册失败：" + e.getMessage());
        }
    }

    /**
     * 获取当前用户信息
     */
    @GetMapping("/current")
    public Result<?> getCurrentUser() {
        try {
            User user = userService.getCurrentUser();
            if (user == null) {
                log.warn("获取当前用户信息失败：用户未登录或登录已过期");
                return Result.error(401, "未登录或登录已过期");
            }
            return Result.success(user);
        } catch (Exception e) {
            log.error("获取当前用户信息时发生异常", e);
            return Result.error("获取用户信息失败：" + e.getMessage());
        }
    }

    /**
     * 用户注销
     */
    @PostMapping("/logout")
    public Result<?> logout(@RequestHeader("Authorization") String token) {
        
        if (userService.logout(token)) {
            return Result.success("注销成功");
        }
        return Result.error("注销失败");
    }

    /**
     * 更新用户信息
     */
    @PutMapping("/info")
    public Result<?> updateUserInfo(@RequestBody User user) {
        try {
            // 参数校验
            if (user == null) {
                return Result.error("请求参数不能为空");
            }

            // 至少要有一个需要更新的字段
            if (!StringUtils.hasText(user.getUsername()) && 
                !StringUtils.hasText(user.getNickname()) && 
                !StringUtils.hasText(user.getEmail()) && 
                !StringUtils.hasText(user.getPhone()) && 
                !StringUtils.hasText(user.getAvatar())) {
                return Result.error("请至少提供一个需要更新的字段");
            }

            // 格式校验
            if (StringUtils.hasText(user.getPhone()) && 
                !user.getPhone().matches("^1[3-9]\\d{9}$")) {
                return Result.error("手机号格式不正确");
            }
            if (StringUtils.hasText(user.getEmail()) && 
                !user.getEmail().matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")) {
                return Result.error("邮箱格式不正确");
            }

            userService.updateUserInfo(user);
            return Result.success("更新成功");
        } catch (Exception e) {
            log.error("更新用户信息失败", e);
            return Result.error(e.getMessage());
        }
    }

    /**
     * 修改密码
     */
    @PutMapping("/password")
    public Result<?> changePassword(@RequestParam String oldPassword, 
                                  @RequestParam String newPassword,@RequestHeader("Authorization") String token) {
        try {
            log.info("收到修改密码请求");
            
            // 参数校验
            if (!StringUtils.hasText(oldPassword)) {
                log.warn("修改密码失败：旧密码为空");
                return Result.error("旧密码不能为空");
            }
            if (!StringUtils.hasText(newPassword)) {
                log.warn("修改密码失败：新密码为空");
                return Result.error("新密码不能为空");
            }
            
            // 新密码不能与旧密码相同
            if (oldPassword.equals(newPassword)) {
                log.warn("修改密码失败：新密码与旧密码相同");
                return Result.error("新密码不能与旧密码相同");
            }

            boolean success = userService.changePassword(oldPassword, newPassword,token);
            if (success) {
                log.info("密码修改成功");
                return Result.success("密码修改成功");
            } else {
                log.warn("密码修改失败：旧密码验证失败");
                return Result.error("密码修改失败，请检查旧密码是否正确");
            }
        } catch (Exception e) {
            log.error("修改密码时发生异常", e);
            return Result.error("修改密码失败：" + e.getMessage());
        }
    }

    /**
     * 检查用户名是否可用
     */
    @GetMapping("/check-username")
    public Result<?> checkUsername(@RequestParam String username) {
        boolean available = userService.checkUsernameAvailable(username);
        return Result.success(available);
    }
    /**
     * 检查用户权限是否可用
     */
    @GetMapping("/check-permission")
    Result<Boolean> checkPermission(@RequestParam("code") String permissionCode){
        boolean flag = userService.checkPermission(permissionCode);
        if(flag){
            return Result.success("有此权限",flag);
        }
        return Result.error("无此权限");
    }
}
